/****************************************************************************
*Traductor de codigo de 3 direcciones a assembler                           *
*Author     :   Simon Emmanuel Gutierrez Brida                              *
*Version    :   0.2                                                         *
*Fecha      :   Octubre/2011                                                *
*----------------------------------------------------                       *
*Traduce comandos de 3 direcciones al codigo correspondiente en assembler   *
*Las tareas que realiza este traductor son:                                 *
*1 - traducir codigo 3d a assembler                                         *
*2 - optimizar el codigo assembler generado                                 *
*3 - insertar codigo auxiliar necesario para generar un ejecutable          *
*****************************************************************************/

#ifndef TRADUCTOR_H
#define TRADUCTOR_H

#include "../genC3D/comando3d.h"
#include "../genC3D/gencom3d.h"
#import "../genC3D/comspecs.h"
#include "../variable.h"
#import "tablastrad.h"
#import "../tipos.h"
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <stdlib.h>

typedef struct {
    Codigo3D *codigo3d;
    FILE *outputFile;
    char *versionAsm;
    char *mainFunc;
} Traductor;

/**Constructores*/

/**
 * Construye un nuevo traductor
 * parametros
 * input: el codigo de tres direcciones que va a ser traducido
 * output: el archivo en el que se escribira la traduccion
 * mainFun: el nombre de la funcion que se esta compilando/traduciendo
 */
Traductor* nuevoTraductor(Codigo3D *input, FILE *output, char *mainFun);

/**Acceso a informacion*/

/**
 * Obtiene el codigo de tres direcciones asociado a un traductor
 * parametros
 * traductor: el traductor del cual obtener el codigo de tres direcciones
 */
Codigo3D* obtenerCodigo3D(Traductor *traductor);

/**
 * Obtiene el archivo de salida asociado a un traductor
 * parametros
 * traductor: el traductor del cual obtener el archivo de salida
 */
FILE* obtenerArchivoOutput(Traductor *traductor);

/**
 * Obtiene la version de assembler a la cual traduce un traductor
 * parametros
 * traductor: el traductor del cual obtener la version assembler utilizada
 */
char* obtenerVersionAssembler(Traductor *traductor);

/**
 * Obtiene el nombre de la funcion principal del codigo a traductir por un traductor
 * parametros
 * traductor: el traductor del cual obtener el nombre de la funcion principal
 */
char* obtenerMainFunc(Traductor *traductor);

/**Modificacion atributos*/

/**
 * Define el archivo de entrada, codigo de tres direcciones, para un traductor
 * parametros
 * traductor: el traductor al cual definir el archivo de entrada
 * input: el codigo de tres direcciones que sera traducido
 */
void definirInput(Traductor *traductor, Codigo3D *input);

/**
 * Define el archivo de salida para un traductor
 * parametros
 * traductor: el traductor al cual definir el archivo de salida
 * output: el archivo de salida del traductor
 */
void definirOutput(Traductor *traductor, FILE *output);

/**
 * Define la version de assembler a la cual compila un traductor
 * parametros
 * traductor: el traductor al cual definir la version assembler utilizada
 * versionAsm: la version assembler a utilizar
 */
void definirVersionAssembler(Traductor *traductor, char *versionAsm);

/**
 * Define el nombre de la funcion principal para el codigo que traduce un traductor
 * parametros
 * traductor: el traductor al cual definir el nombre de la funcion principal
 * mainFun: el nombre de la funcion
 */
void definirMainFunc(Traductor *traductor, char *mainFun);

/**Traduccion*/

/**
 * Ejecuta uno o mas algoritmos de optimizacion sobre el input de un traductor
 * parametros
 * traductor: el traductor del cual obtener el codigo a optimizar
 */
Codigo3D* optimizarInput(Traductor *traductor);

/**
 * Traduce el codigo entrada asociado a un traductor al codigo salida
 * parametros
 * traductor: el traductor que realizara la traduccion
 */
void traducir(Traductor *traductor);

#endif